<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
    //   var fn
      function fn(){
            console.log('fn');
        }
      //   var a;
      // 预解析。变量提升 hosting
      // js 被称为解释性语言   js在执行的时候会有两步: 1、先解释（编译）2、执行

      //一、变量的提升
      //变量在js解释阶段 会把变量的声明提升到最开始
      //    var a        //变量声明
      //    console.log(a);
      //    a  = 10;   //声明之后赋值
      //变量的声明
      //   a = 20; //变量的赋值
      //   console.log(a);
      //    var a =10
      //   console.log(a)
      // var a=10
      //二、函数的提升;
      //1、赋值式 ，提升和变量的提升类似
    //   console.log(fn) //undefined
    //   fn = function () {
    //     console.log('fn')
    //   }

      //2、声明式的预解析  会把整个函数提升至作用域最上方
    //   console.log(fn);
    //总结 在js预解析阶段，1、如果是变量的话，会把声明提高到最上方  
     // 2、如果是函数 则会把函数的定义提升到最上方
   //  赋值式=变量提升
    // 声明式将函数的全部提升到最上方

    </script>
  </body>
</html>
